package eshop.local.logic;

import java.io.*;
import java.net.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.List;
import java.util.Vector;

import eshop.local.valueobjects.*;



public class EshopClient {		

	Socket requestSocket;
	ObjectOutputStream out;
 	ObjectInputStream in;
 	
	public EshopClient() throws IOException, ClassNotFoundException {
	
		
	
	}
	
		
	public void senden ()  {
		
		try{
			//1. creating a socket to connect to the server
			requestSocket = new Socket("localhost", 5678);
			System.out.println("Connected to localhost in port 5678");
			//2. get Input and Output streams
			out = new ObjectOutputStream(requestSocket.getOutputStream());
			in = new ObjectInputStream(requestSocket.getInputStream());
			} catch(IOException ioException){
				ioException.printStackTrace();
				}
		}

	
	
	public List<Object> suche(String eingabe) throws ClassNotFoundException {
			
		 List<Object> list = new Vector<Object>();
 
		 try {
			 	senden ();
				out.writeObject("suche");
				out.writeObject(eingabe);
				list	= (List<Object>)in.readObject();
			} catch (IOException e) {
				
				}
		 return list;
		
	}
		
	/*
	 * ** Aktionen mit Artikeln **
	 * -Ausgabe der Artikelliste
	 * -suchen
	 * -Artikel anhand der Nummer ausgeben
	 * -hinzufuegen
	 * -Artikelnummer Vergabe
	 * -Artikel bearbeiten
	 * -Artikel speichern (wird atm nicht einzeln gebraucht)
	 */
	
	/**
	 * Ausgabe der Artikelliste	
	 * @return
	 * @throws ClassNotFoundException 
	 */
	public List<Artikel> gibAlleArtikel() throws ClassNotFoundException {

		List<Artikel> list = new Vector<Artikel>();
		
		try {
			senden();
			out.writeObject("gibAlleArtikel");
			list	= (List<Artikel>)in.readObject();
			beenden();
		} catch (IOException e) {
			
			}
		return list;
	}
	
	/**
	 * Artikel suchen
	 * @return
	 * @throws ClassNotFoundException 
	 */
	public List<Artikel> sucheNachArtikel(String eingabe) throws ClassNotFoundException {
		
		List<Artikel> list = new Vector<Artikel>();
		
		try {
			senden ();
			out.writeObject("sucheNachArtikel");
			out.writeObject(eingabe);
			list = (List<Artikel>)in.readObject();
		} catch (IOException e) {}
		return list;
	}
	/**
	 * Artikel anhand der Nummer ausgeben
	 * @param n
	 * @param p
	 * @param v
	 * @throws ClassNotFoundException 
	 */
	public Artikel gibArtikelMitNummer(int nummer) throws ClassNotFoundException {
		
		Artikel a = null;
		
		try {
			senden ();
			out.writeObject("gibArtikelMitNummer");
			out.writeObject(nummer);
			a	= (Artikel)in.readObject();
			beenden();
		} catch (IOException e) {
			
			}

		return a;
	}
	
	/**
	 * Artikel hinzufuegen
	 * @param a
	 * @throws ClassNotFoundException 
	 */
	public void artikelHinzufuegen(Artikel a) throws ClassNotFoundException {
		
		try {
			senden ();
			out.writeObject("artikelHinzufuegen");
			out.writeObject(a);
			out.flush();
		} catch (IOException e) {
			
		}
		
	}
	/**
	 * Artikelnummernvergabe
	 * @return
	 * @throws ClassNotFoundException 
	 * @throws NumberFormatException 
	 */
	public int vergebeArtikelNummer() throws NumberFormatException, ClassNotFoundException {
		
		int n = 0;
		
		try {
			senden ();
			out.writeObject("vergebeArtikelNummer");
			 n = (Integer)in.readObject();
		} catch (IOException e) {}
		return n;
	}

	
	/**
	 * Artikel bearbeiten
	 * @param n
	 * @param p
	 * @param v
	 */
	public void bearbeiteArtikel(int n, String p, String v, int u) {
		
		try {
			
			senden ();
			out.writeObject("bearbeiteArtikel");
			out.writeObject(n);
			out.writeObject(p);
			out.writeObject(v);
			out.writeObject(u);
		} catch (IOException e) {}	
	}
	
	/**
	 * Artikel speichern
	 * @param dateiA
	 * @throws IOException
	 */
	public void artikelSpeichern() throws IOException {
		try {
			senden ();
			out.writeObject("artikelSpeichern");
			} catch (IOException e) {}
	}
	
	
	/*
	 * ** Aktionen mit Kunde **
	 * -Ausgabe der Kundenliste
	 * -suchen
	 * -Kunde anhand der Nummer ausgeben
	 * -Kunde hinzufuegen
	 * -Kundennummer Vergabe
	 * -Kunde bearbeiten
	 * -Kunde entfernen
	 * -Kunde speichern (wird atm nicht einzeln gebraucht)
	 */
	
	/**
	 * Ausgabe der Kundenliste	
	 * @return
	 * @throws ClassNotFoundException 
	 */
	public List<Kunde> gibAlleKunden() throws ClassNotFoundException {
		
		List<Kunde> list = new Vector<Kunde>();
		
		try {
			senden ();
			out.writeObject("gibAlleKunden");
			out.flush();
			list	= (List<Kunde>)in.readObject();
			beenden();
		} catch (IOException e) {
			
			}
		return list;
	}
	
	/**
	 * suche nach Kunde
	 * @param n
	 * @param p
	 * @throws ClassNotFoundException 
	 */
	public List<Kunde>sucheNachKunde(String name) throws ClassNotFoundException {
		
		List<Kunde> list = new Vector<Kunde>();
		
		try {
			senden ();
			out.writeObject("sucheNachKunde");
			out.writeObject(name);
			list	= (List<Kunde>)in.readObject();
		} catch (IOException e) {
			
			}
		return list;
	}
	/**
	 * Kunde anhand der Nummer ausgeben
	 * @param n
	 * @throws ClassNotFoundException 
	 */
	public Kunde gibKundeMitNummer(int nummer) throws ClassNotFoundException {
		
		Kunde k = null;
		
		try {
			senden ();
			out.writeObject("gibKundeMitNummer");
			out.writeObject(nummer);
			k = (Kunde)in.readObject();
			beenden();
		} catch (IOException e) {}	
		
		return k;
	}
	/**
	 * Kunde hinzufuegen
	 * @param u
	 * @throws ClassNotFoundException 
	 */
	public boolean kundenHinzufuegen(Kunde k) throws ClassNotFoundException { 
		
		String done = "";
		
		try {
			senden ();
			out.writeObject("kundenHinzufuegen");
			out.writeObject(k);
			done = (String)in.readObject();
		} catch (IOException e) {}
		if(done.equals("Done")) {
			return true;
			} else {
				return false;
			}
	}

	/**
	 * Kundennummernvergabe
	 * @return
	 * @throws ClassNotFoundException 
	 * @throws NumberFormatException 
	 */
	public int vergebeKundenNummer() throws NumberFormatException, ClassNotFoundException {
		
		int n = 0;
		 
		try {
			senden ();
			out.writeObject("vergebeKundenNummer");
			n = (Integer)in.readObject();
			beenden();
		} catch (IOException e) {}
		return n;
	}

	/**
	 * Kunde bearbeiten
	 * @param n
	 * @param p
	 * @param v
	 */
	public void bearbeiteKunde(String n, String p, String v) {
		
		try {
			senden ();
			out.writeObject("bearbeiteKunde");
			out.writeObject(n);
			out.writeObject(p);
			out.writeObject(v);
		} catch (IOException e) {}
	}
	
	/**
	 * Kunde entfernen
	 * @param k
	 */
	public void kundenEntfernen(Kunde k) {
		try {
			senden ();
			out.writeObject("kundenEntfernen");
			out.writeObject(k);
		} catch (IOException e) {}
	}
	
	/**
	 * Kunde abspeichern
	 * @param dateiU
	 * @throws IOException
	 */
	public void kundeSpeichern() throws IOException {
		try {
			senden ();
			out.writeObject("kundeSpeichern");
			} catch (IOException e) {}
	}
	
	/*
	 * ** Aktionen mit Mitarbeiter **
	 * -Ausgabe der Mitarbeiterliste
	 * -suchen
	 * -Mitarbeiter anhand der Nummer ausgeben
	 * -hinzufuegen
	 * -Mitarbeiternummer Vergabe
	 * -Mitarbeiter bearbeiten
	 * -Mitarbeiter entfernen
	 * -Mitarbeiter speichern (wird atm nicht einzeln gebraucht)
	 */
	
	/**
	 * Ausgabe der Mitarbeiterliste	
	 * @return
	 * @throws ClassNotFoundException 
	 */
	public List<Mitarbeiter> gibAlleMitarbeiter() throws ClassNotFoundException {
		
	List<Mitarbeiter> list = new Vector<Mitarbeiter>();
		
		try {
			senden();
			out.writeObject("gibAlleMitarbeiter");
			list	= (List<Mitarbeiter>)in.readObject();
		} catch (IOException e) {
			
			}
		return list;
	}
	
	/**
	 * suche nach Mitarbeiter
	 * @param n
	 * @param p
	 * @throws ClassNotFoundException 
	 */
	public List<Mitarbeiter>sucheNachMitarbeiter(String name) throws ClassNotFoundException {
		List<Mitarbeiter> list = new Vector<Mitarbeiter>();
		
		try {
			senden ();
			out.writeObject("sucheNachMitarbeiter");
			out.writeObject(name);
			list	= (List<Mitarbeiter>)in.readObject();
		} catch (IOException e) {
			}
		return list;
	}
	/**
	 * Mitarbeiter anhand der Nummer ausgeben
	 * @param n
	 * @param p
	 * @param v
	 * @throws ClassNotFoundException 
	 */
	public Mitarbeiter gibMitarbeiterMitNummer(int nummer) throws ClassNotFoundException {
		
		Mitarbeiter m = null;
		try {
			senden ();
			out.writeObject("gibMitarbeiterMitNummer");
			out.writeObject(nummer);
			m = (Mitarbeiter)in.readObject();
			beenden();
		} catch (IOException e) {}		
		return m;
	}
	/**
	 * Mitarbeiter hinzufuegen
	 * @param u
	 * @throws ClassNotFoundException 
	 */
	public boolean mitarbeiterhinzufuegen(Mitarbeiter m) throws ClassNotFoundException {
		
		String done = "";
		
		try {
			senden ();
			out.writeObject("mitarbeiterHinzufuegen");
			out.writeObject(m);
		} catch (IOException e) {}
	 return true;
	}

	/**
	 * Mitarbeiter bearbeiten
	 * @param n
	 * @param p
	 * @param v
	 */
	public void bearbeiteMitarbeiter(String n, String p, String v) {
		try {
			senden ();
			out.writeObject("bearbeiteMitarbeiter");
			out.writeObject(n);
			out.writeObject(p);
			out.writeObject(v);
		} catch (IOException e) {}
	}
	
	/**
	 * Mitarbeiter entfernen
	 * @param a
	 */
	public void mitarbeiterentfernen(Mitarbeiter m) {
		try {
			senden ();
			out.writeObject("mitarbeiterEntfernen");
			out.writeObject(m);
		} catch (IOException e) {}
	}
	/**
	 * Mitarbeiternummernvergabe
	 * @return
	 * @throws ClassNotFoundException 
	 * @throws NumberFormatException 
	 */
	public int vergebeMitarbeiterNummer() throws NumberFormatException, ClassNotFoundException {
		
		int n = 0;
		 
		try {
			senden ();
			out.writeObject("vergebeMitarbeiterNummer");
			n = (Integer)in.readObject();
			beenden();
		} catch (IOException e) {}
		return n;
	}
	
	/**
	 * Mitarbeiter abspeichern
	 * @param dateiU
	 * @throws IOException
	 */
	public void mitarbeiterSpeichern() throws IOException {
		
		try {
			senden ();
			out.writeObject("mitarbeiterSpeichern");
			} catch (IOException e) {}
	}
	
	public void gebeWarenkorbAb(Basket basket){
		
		try {
			senden ();
			out.writeObject("gebeWarenkorbAb");
			out.writeObject(basket);
			} catch (IOException e) {}
	}
	
	/**
	 * Ausgabe der Transferliste	
	 * @return
	 * @throws ClassNotFoundException 
	 */
	public List<Transfer> gibAlleTransfer() throws ClassNotFoundException {

		List<Transfer> list = new Vector<Transfer>();
		
		try {
			senden ();
			out.writeObject("gibAlleTransfer");
			out.flush();
			list	= (List<Transfer>)in.readObject();
		} catch (IOException e) {
			
			}
		return list;
	}
	
	public Rechnung gibRechnungMitNummer(int nummer) throws ClassNotFoundException {
		
		Rechnung r = null;
		
		try {
			senden ();
			out.writeObject("gibRechnungMitNummer");
			out.writeObject(nummer);
			r = (Rechnung)in.readObject();
			} catch (IOException e) {}	
			return r;
}
	
	
	
	
	public void tranferSpeichern() throws IOException {
		try {
			senden ();
			out.writeObject("transferSpeichern");
			} catch (IOException e) {}
	}
	
	public void rechnungenSpeichern() throws IOException {
		
		try {
			senden ();
			out.writeObject("rechnungenSpeichern");
			} catch (IOException e) {}
	}
	
	// *** Alles speichern ***
	/**
	 * Kunden & Artikel zusammen speichern
	 * @param dateiU
	 * @param dateiA
	 * @throws IOException
	 */
	public void allesSpeichern()throws IOException {
		try {
			senden ();
			out.writeObject("allesSpeichern");
			beenden();
			} catch (IOException e) {}
	}
	
	public void beenden() {
		try {
			senden ();
			out.writeObject("closeClient");
			in.close();
			out.close();
			// requestSocket.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
	
}